REM >Director:Menus.System.CDLib
REM  Jon Wright, iX Software
REM 0.05a
REM
REM Now check the status if the drive, and if it is empty tells the user
REM Now correctly gets the CD drive number
REM Philip Ludlam, Tuesday the 18th of April, 2000

ON ERROR PROCerror("Director:Menus.System.CDLib - "+REPORT$+" at line "+STR$ ERL):END

DIM trk_blk% 5
DIM trk_blk2% 5

DIM cdfs_block% 20

cur_trk = 0
REM read current drive
SYS "XOS_ReadVarVal","Director$CDDrive",cdfs_block%,20,0,1 TO ;flags%
IF (flags% AND 1) device_no=0 ELSE device_no=!cdfs_block%

SYS "OS_GetEnv" TO in$
menu_type$=FNarg(in$,"-menu","")
com_type$=FNarg(in$,"-do","")

REM call CDFS_ConvertDriveToDevice (SWI &41E80)
SYS &41E80, device_no TO ,phys_no%

REM setup cdfs_block using what is returned in r1
cdfs_block%!0= ( phys_no%        AND &0007)
cdfs_block%!4= ((phys_no% >> 3 ) AND &0003)
cdfs_block%!8= ((phys_no% >> 5 ) AND &0007)
cdfs_block%!&C=((phys_no% >> 8 ) AND &00FF)
cdfs_block%!16=((phys_no% >> 16) AND &FFFF)

REM call CD_DriveStatus (SWI &41243)
SYS &41243,,,,,,,,cdfs_block% TO status
IF status>3 PROCno_cd:END

REM call CDFS_AudioStatus (SWI &41254)
SYS &41254,,,,,,,,cdfs_block% TO status

REM call CDFS_EnquireTrack (SWI &4124E)
SYS &4124E, 0, trk_blk%,,,,,,cdfs_block%

REM set up values for use with director
first_trk_no=trk_blk%?0
last_trk_no=trk_blk%?1
:
FOR n = first_trk_no TO last_trk_no
  REM call CD_EnquireTrack (SWI &4124E)
  SYS &4124E ,n,trk_blk%,,,,,,cdfs_block%
  IF n <> last_trk_no THEN
    SYS &4124E, n+1,trk_blk2%,,,,,,cdfs_block%
  ELSE
    trk_blk2%=trk_blk%+1
  ENDIF
  REM call CD_EnquireAddress (SWI &41249)
  SYS &41249, 0,,,,,,,cdfs_block% TO cur_addr
  IF cur_addr>!trk_blk% AND cur_addr<!trk_blk2% THEN
  cur_trk = n
  ENDIF
NEXT
:
CASE menu_type$ OF
  WHEN "ControlPanel"
    PROCcntrlmnu

  WHEN "PlayTracks"
    PROCplytrks

  OTHERWISE

    CASE com_type$ OF
      WHEN "Pause"
      PROCpause
    ENDCASE

ENDCASE
:
END
:
DEF PROCcntrlmnu

REM setup the ControlPanel menu
SYS "Director_Menu","Control_Panel -temp"
CASE status OF
   WHEN 0
     PROCmenuitem(STR$(cur_trk)+"/"+STR$(last_trk_no)+"isplaying -sprite smcddisc","")
     PROCmenuitem("PauseAudio -sprite smpause","Run Director:menus.System.CDLib -do Pause")
     PROCmenuitem("StopAudio -sprite smstop","CDFS:Stop "+STR$(device_no))

     IF (cur_trk) > first_trk_no THEN
       PROCmenuitem("BackTrack -sprite smskipb","CDFS:Play "+STR$(cur_trk-1)+" "+STR$(device_no))
     ENDIF

     IF (cur_trk) < last_trk_no THEN
       PROCmenuitem("SkipTrack -sprite smskipf","CDFS:Play "+STR$(cur_trk+1)+" "+STR$(device_no))
     ENDIF

   WHEN 1
     PROCmenuitem(STR$(cur_trk)+"/"+STR$(last_trk_no)+"ispaused -sprite smcddisc","")
     PROCmenuitem("ResumeAudio -sprite smplay","Run Director:menus.System.CDLib -do Pause")
     PROCmenuitem("StopAudio -sprite smstop","CDFS:Stop "+STR$(device_no))

   OTHERWISE
     PROCmenuitem("Notrackplaying -sprite smcddisc","")
     PROCmenuitem("PlayAudio -sprite smplay","CDFS:Play 1 "+STR$(device_no))
ENDCASE

SYS "Director_EndMenu"
*Set Director$Menu Control_Panel

ENDPROC
:
DEF PROCplytrks
REM setup the menu that shows the tracks to be played
SYS "Director_Menu","Play -temp"
  FOR n = first_trk_no TO last_trk_no

    IF n = cur_trk THEN
      PROCmenuitem(STR$(n)+" -tick -sprite smcddisc","CDFS:Play "+STR$(n)+" "+STR$(device_no))
    ELSE
      PROCmenuitem(STR$(n)+" -sprite smcddisc","CDFS:Play "+STR$(n)+" "+STR$(device_no))
    ENDIF
  NEXT
SYS "Director_EndMenu"
*Set Director$Menu Play
ENDPROC
:
DEF PROCpause
REM call CDFS_AudioStatus (SWI &41254)
SYS &41254,,,,,,,,cdfs_block% TO status
CASE status OF
  WHEN 0
    SYS "CD_AudioPause",1,,,,,,,cdfs_block%
  OTHERWISE
    SYS "CD_AudioPause",0,,,,,,,cdfs_block%
ENDCASE
ENDPROC
:
DEF FNarg(str$,arg$,def$)
LOCAL i,j
i=INSTR(str$,arg$)
IF i=0 THEN =def$
i+=LEN arg$+1
j=INSTR(str$+" <"," ",i)
=MID$(str$,i,j-i)
:
DEF PROCmenuitem(itemname$,command$)
  SYS "Director_Option",itemname$
  IF command$="" THEN
    ENDPROC
  ELSE
    SYS "Director_Command",command$
  ENDIF
ENDPROC
:
REM just incase! ;-)
DEF PROCerror(err$)
  DIM block% 255
  !block%=255
  $(block%+4)=err$+CHR$0
  SYS "Wimp_ReportError",block%,1,"CD Audio Menu (Director)"
ENDPROC
:
DEF PROCno_cd
SYS "Director_Menu",menu_type$+" -temp"
PROCmenuitem("""(drive empty)"" -grey","")
SYS "Director_EndMenu"
OSCLI("Set Director$Menu "+menu_type$)
ENDPROC
